/**
 * 
 */
package com.hexacta.hrs.domain.feedback;

import java.sql.Blob;
import java.util.Date;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.vectrics.common.db.AbstractRecordObject;

/**
 * Archivos Adjuntos.
 * 
 * @author mperezvega, mmatrichuk
 * @date Feb 10, 2009
 */
public class ArchivoAdjunto extends AbstractRecordObject {

    /** EL TAMA�O MAXIMO DEL ARCHIVO ADJUNTO ES DE 3 MEGA BYTES */
    private static final int TAMANIO_MAXIMO = 1024 * 1024 * 3;

    /** nombre */
    private String nombre;

    /** fechaUpload */
    private Date fechaUpload;

    /** bytes */
    private byte[] bytes;

    private String contentType;

    /**
     * Constructor
     * 
     * @param path
     * @param fechaUpload
     */
    public ArchivoAdjunto(final String nombre, final byte[] bytes) {
        this.nombre = nombre;
        fechaUpload = new Date();
        this.bytes = bytes;
        validarTamanioMaximo(bytes);
    }

    /**
     * Valida que el tama�o maximo de un archivo adjunto no supere el tama�o
     * maximo.
     * 
     * @param bytesDelArchivo
     */
    private void validarTamanioMaximo(final byte[] bytesDelArchivo) {
        if (bytesDelArchivo != null && bytesDelArchivo.length > TAMANIO_MAXIMO)
            throw new FileExceedsMaximumUploadSizeException();
    }

    /**
     * @return nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @return fechaUpload
     */
    public Date getFechaUpload() {
        return fechaUpload;
    }

    /**
     * @return bytes
     */
    public byte[] getBytes() {
        return bytes;
    }

    /**
     * @param bytes
     *            bytes a setear
     */
    public void setBytes(final byte[] bytes) {
        this.bytes = bytes;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(final String contentType) {
        this.contentType = contentType;
    }

    @Override
    public boolean equals(final Object obj) {
        ArchivoAdjunto otroArchivoAdjunto = (ArchivoAdjunto) obj;
        return new EqualsBuilder().append(nombre, otroArchivoAdjunto.nombre)
                .append(fechaUpload, otroArchivoAdjunto.fechaUpload).append(bytes, otroArchivoAdjunto.bytes).isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(nombre).append(fechaUpload).append(bytes).toHashCode();
    }

    /**
     * Constructor para Hibernate
     * 
     * @SuppressWarnings("unused")
     */
    public ArchivoAdjunto() {
        fechaUpload = new Date();
    }

    @SuppressWarnings("unused")
    private void setBytesAsBlob(final Blob blob) {
        bytes = BlobByteArrayUtils.toByteArray(blob);
    }

    @SuppressWarnings("unused")
    private Blob getBytesAsBlob() {
        return BlobByteArrayUtils.createBlob(bytes);
    }

    /**
     * Seter, se crean privados para que los use dozer.
     * 
     * @param nombre
     */
    public void setNombre(final String nombre) {
        this.nombre = nombre;
    }

    public void setFechaUpload(final Date fecha) {
        fechaUpload = fecha;
    }
}
